import luckysheetConfigsetting from '../controllers/luckysheetConfigsetting'
import Store from '../store'

export const error = {
  v: '#VALUE!', //错误的参数或运算符
  n: '#NAME?', //公式名称错误
  na: '#N/A', //函数或公式中没有可用数值
  r: '#REF!', //删除了由其他公式引用的单元格
  d: '#DIV/0!', //除数是0或空单元格
  nm: '#NUM!', //当公式或函数中某个数字有问题时
  nl: '#NULL!', //交叉运算符（空格）使用不正确
  sp: '#SPILL!', //数组范围有其它值
}

//是否是空值
function isRealNull(val) {
  if (val == null || val.toString().replace(/\s/g, '') == '') {
    return true
  } else {
    return false
  }
}

//是否是纯数字
function isRealNum(val) {
  if (val == null || val.toString().replace(/\s/g, '') === '') {
    return false
  }

  if (typeof val == 'boolean') {
    return false
  }

  if (!isNaN(val)) {
    return true
  } else {
    return false
  }
}

//是否是错误类型
function valueIsError(value) {
  let isError = false

  for (let x in error) {
    if (value == error[x]) {
      isError = true
      break
    }
  }

  return isError
}

//是否有中文
function hasChinaword(s) {
  let patrn = /[\u4E00-\u9FA5]|[\uFE30-\uFFA0]/gi

  if (!patrn.exec(s)) {
    return false
  } else {
    return true
  }
}

//是否为非编辑模式
function isEditMode() {
  if (luckysheetConfigsetting.editMode) {
    return true
  } else {
    return false
  }
}

/**
 * @description: 检查是否允许前台进行表格编辑
 * @param {*}
 * @return {Boolean} true:允许编辑 fasle:不允许
 */
function checkIsAllowEdit() {
  if (Store.allowEdit) {
    return true
  } else {
    return false
  }
}

//范围是否只包含部分合并单元格
function hasPartMC(cfg, r1, r2, c1, c2) {
  let hasPartMC = false

  for (let x in Store.config['merge']) {
    let mc = cfg['merge'][x]

    if (r1 < mc.r) {
      if (r2 >= mc.r && r2 < mc.r + mc.rs - 1) {
        if (c1 >= mc.c && c1 <= mc.c + mc.cs - 1) {
          hasPartMC = true
          break
        } else if (c2 >= mc.c && c2 <= mc.c + mc.cs - 1) {
          hasPartMC = true
          break
        } else if (c1 < mc.c && c2 > mc.c + mc.cs - 1) {
          hasPartMC = true
          break
        }
      } else if (r2 >= mc.r && r2 == mc.r + mc.rs - 1) {
        if (c1 > mc.c && c1 < mc.c + mc.cs - 1) {
          hasPartMC = true
          break
        } else if (c2 > mc.c && c2 < mc.c + mc.cs - 1) {
          hasPartMC = true
          break
        } else if (c1 == mc.c && c2 < mc.c + mc.cs - 1) {
          hasPartMC = true
          break
        } else if (c1 > mc.c && c2 == mc.c + mc.cs - 1) {
          hasPartMC = true
          break
        }
      } else if (r2 > mc.r + mc.rs - 1) {
        if (c1 > mc.c && c1 <= mc.c + mc.cs - 1) {
          hasPartMC = true
          break
        } else if (c2 >= mc.c && c2 < mc.c + mc.cs - 1) {
          hasPartMC = true
          break
        } else if (c1 == mc.c && c2 < mc.c + mc.cs - 1) {
          hasPartMC = true
          break
        } else if (c1 > mc.c && c2 == mc.c + mc.cs - 1) {
          hasPartMC = true
          break
        }
      }
    } else if (r1 == mc.r) {
      if (r2 < mc.r + mc.rs - 1) {
        if (c1 >= mc.c && c1 <= mc.c + mc.cs - 1) {
          hasPartMC = true
          break
        } else if (c2 >= mc.c && c2 <= mc.c + mc.cs - 1) {
          hasPartMC = true
          break
        } else if (c1 < mc.c && c2 > mc.c + mc.cs - 1) {
          hasPartMC = true
          break
        }
      } else if (r2 >= mc.r + mc.rs - 1) {
        if (c1 > mc.c && c1 <= mc.c + mc.cs - 1) {
          hasPartMC = true
          break
        } else if (c2 >= mc.c && c2 < mc.c + mc.cs - 1) {
          hasPartMC = true
          break
        } else if (c1 == mc.c && c2 < mc.c + mc.cs - 1) {
          hasPartMC = true
          break
        } else if (c1 > mc.c && c2 == mc.c + mc.cs - 1) {
          hasPartMC = true
          break
        }
      }
    } else if (r1 <= mc.r + mc.rs - 1) {
      if (c1 >= mc.c && c1 <= mc.c + mc.cs - 1) {
        hasPartMC = true
        break
      } else if (c2 >= mc.c && c2 <= mc.c + mc.cs - 1) {
        hasPartMC = true
        break
      } else if (c1 < mc.c && c2 > mc.c + mc.cs - 1) {
        hasPartMC = true
        break
      }
    }
  }

  return hasPartMC
}

//获取单个字符的字节数
function checkWordByteLength(value) {
  return Math.ceil(value.charCodeAt().toString(2).length / 8)
}

export {
  isRealNull,
  isRealNum,
  valueIsError,
  hasChinaword,
  isEditMode,
  checkIsAllowEdit,
  hasPartMC,
  checkWordByteLength,
}
